function (out) {
    var uuid = this.uuid,
        zcls = this.getZclass(),
        toolbar = this.firstChild,
        bdTime = this.zoneBd.getTime(),
        current = new Date(),
        weekend = [-1, -1];

    // round corner
    var t1 = zcls + "-t1",
        t2 = zcls + "-t2",
        t3 = zcls + "-t3",
        b1 = zcls + "-b1",
        b2 = zcls + "-b2",
        b3 = zcls + "-b3";

    // CSS ClassName
    var header = zcls + "-header",
        body = zcls + "-body",
        inner = zcls + "-inner",
        month = zcls + "-month-cnt",
        monthInner = month + "-inner",

        month_header = zcls + "-month-header",
        month_body = zcls + "-month-body",
        month_week = zcls + "-month-week",

        month_date = zcls + "-month-date",
        month_date_off = zcls + "-month-date-off",
        month_date_cnt = month_date + "-cnt",

        week_weekend = zcls + "-week-weekend",
        week_today = zcls + "-week-today",

        day_of_week = zcls + "-days-of-week",
        day_of_month_bg = zcls + "-day-of-month-bg",
        day_of_month_body = zcls + "-day-of-month-body",
        day_of_outside = zcls + "-outside";

    out.push('<div', this.domAttrs_(), '>');
    if (toolbar) {
        out.push('<div id="', uuid, '-tb" class="', header, '">');
        toolbar.redraw(out);
        out.push('</div>');
    }
    out.push('<div class="', t1, '"></div>',
        '<div class="', t2, '">',
        '<div class="', t3, '"></div></div>',
        '<div id="', uuid, '-body" class="', body, '">',
        '<div class="', inner, '">',
        /***************************************************************************/
        '<div id="', uuid, '-inner" class="', month, '">',
        '<div class="', monthInner, '">',

        // title
        '<table class="', month_header, '" cellpadding="0" cellspacing="0"><tbody><tr>');

    // day-of-week
    var bd = new Date(bdTime),
        captionByDayOfWeek = this._captionByDayOfWeek;
    for (var index = 0, k = 0; k < 7; ++k) {
        var content = captionByDayOfWeek ? captionByDayOfWeek[k] :
            zk.fmt.Date.formatDate(bd, 'EEE');
        var len = content.length + content.replace(/[\u0000-\u00ff]/g, "").length;
        if (len > 3)
            content = content.substring(2);
        out.push('<th class="', day_of_week);

        if (bd.getDay() == 0 || bd.getDay() == 6) {//SUNDAY or SATURDAY
            weekend[index++] = k;
            out.push(' ', week_weekend);
        }
        out.push('">', content, '</th>');
        bd = calUtil.addDay(bd, 1);
    }
    out.push('</tr></tbody></table>');

    // calculate how many weeks we should display
    var weeks = this.weekOfMonth,
        number = 100 / weeks;

    //events content
    out.push('<div id="', uuid, '-cnt" class="', month_body, '">');

    // reset date
    bd.setTime(bdTime);

    // current date
    var curMonth = current.getMonth(),
        captionByDateOfMonth = this._captionByDateOfMonth;

    for (var j = 0; j < weeks; j++) {
        out.push('<div class="', month_week, '" style="top:',
            (number * j), '%; height:', number, '%;">',
            '<table class="', day_of_month_bg,
            '" cellpadding="0" cellspacing="0"><tbody><tr>');

        var tempBd = new Date(bd);
        for (var i = 0; i < 7; i++) {
            out.push('<td class="');

            if (weekend[0] == i || weekend[1] == i)
                out.push(' ', week_weekend);

            if (calUtil.isTheSameDay(current, tempBd))
                out.push(' ', week_today);

            if (this._currentDate.getMonth() != tempBd.getMonth())
                out.push(' ', day_of_outside);

            out.push('">&nbsp;</td>');
            tempBd = calUtil.addDay(tempBd, 1);
        }

        out.push('</tr></tbody></table>',
            '<table class="', day_of_month_body, '" cellpadding="0" cellspacing="0">',
            '<tbody><tr>');

        // the title of day of week
        for (var i = 0; i < 7; i++) {
            var content = captionByDateOfMonth ? captionByDateOfMonth[j * 7 + i] :
                bd.getDate();
            out.push('<td class="', month_date);

            if (weekend[0] == i || weekend[1] == i)
                out.push(' ', week_weekend);

            if (calUtil.isTheSameDay(current, bd))//today
                out.push(' ', week_today);

            if (this._currentDate.getMonth() != bd.getMonth())
                out.push(' ', day_of_outside);

            if (curMonth != bd.getMonth())
                out.push(' ', month_date_off);

            if (bd.getDate() == 1 && !captionByDateOfMonth)
                content = zk.fmt.Date.formatDate(bd, 'MMM d');
            out.push('"><span class="', month_date_cnt, '">', content, '</span></td>');

            bd = calUtil.addDay(bd, 1);
            if (bd.getDate() == content) //ZKCAL-50: DST time happens on 00:00 AM
                bd.setHours(bd.getHours() + 2); //adjust to correct date
        }
        out.push('</tr></tbody></table></div>');
    }
    out.push('</div></div></div>',
        /***************************************************************************/
        '</div></div>',
        '<div class="', b2, '">',
        '<div class="', b3, '"></div></div>',
        '<div class="', b1, '"></div>',
        '<div id="', uuid, '-sdw" class="', zcls, '-fl">',
        '<div class="', zcls, '-fr">',
        '<div class="', zcls, '-fm"></div></div></div></div>');
}